/*
 * Copyright 2010-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *    http://aws.amazon.com/apache2.0
 *
 * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
 * OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and
 * limitations under the License.
 */

package com.amazonaws.mobileconnectors.amazonmobileanalytics.utils;

import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;

import java.util.Locale;

public class ApplyLocalesRule implements MethodRule {

    private Locale[] locales;

    public ApplyLocalesRule(Locale[] localesToApply) {
        this.locales = localesToApply;
    }

    @Override
    public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
        if (locales.length != 0) {
            return new Statement() {

                @Override
                public void evaluate() throws Throwable {
                    Locale original = Locale.getDefault();
                    System.out.println(String.format("Original locale: %s", original.toString()));

                    for (Locale locale : locales) {

                        Locale.setDefault(locale);
                        System.out.println("Locale set to: " + Locale.getDefault().toString());
                        try {
                            if (target instanceof LocaleTestingSetupAndTeardown) {
                                ((LocaleTestingSetupAndTeardown) target).setupForRepeatedTestCase();
                                System.out.println("Running test..."
                                        + method.getDeclaringClass().getCanonicalName() + " : "
                                        + method.getName());
                                base.evaluate();
                                ((LocaleTestingSetupAndTeardown) target)
                                        .teardownForRepeatedTestCase();
                            } else {
                                base.evaluate();
                            }
                        } catch (Exception e) {
                            System.out.println(String.format(
                                    "Test method '%s' failed with locale '%s'", method.getName(),
                                    locale.toString()));
                            throw e;
                        }
                    }

                    Locale.setDefault(original);
                    System.out.println("Locale set back to: " + Locale.getDefault().toString());
                }

            };
        }
        return base;
    }
}
